package com.zenithmind.document.repository;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.zenithmind.document.pojo.domain.Document;
import com.zenithmind.document.pojo.query.DocumentQueryDTO;
import com.zenithmind.document.pojo.vo.DocumentDetailVO;
import com.zenithmind.document.pojo.vo.DocumentStatisticsVO;

import java.util.List;

/**
 * 文档仓储接口
 * 遵循依赖倒置原则：定义抽象的数据访问接口
 * 遵循接口隔离原则：只包含文档相关的数据访问方法
 * 
 * @author ZenithMind Team
 * @since 2025-01-09
 */
public interface DocumentRepository {

    /**
     * 根据ID查询文档
     */
    Document findById(String id);

    /**
     * 保存文档
     */
    Document save(Document document);

    /**
     * 更新文档
     */
    Boolean update(Document document);

    /**
     * 删除文档
     */
    Boolean deleteById(String id);

    /**
     * 批量删除文档
     */
    Boolean deleteByIds(List<String> ids);

    /**
     * 检查文档是否存在
     */
    Boolean existsById(String id);

    /**
     * 分页查询文档
     */
    IPage<Document> findPage(DocumentQueryDTO queryDTO);

    /**
     * 查询文档详情（包含关联信息）
     */
    DocumentDetailVO findDetailById(String id, String userId);

    /**
     * 检查文档权限
     */
    Boolean checkPermission(String documentId, String userId, String permission);

    /**
     * 查询用户文档
     */
    List<Document> findByCreatorId(String creatorId);

    /**
     * 查询分类文档
     */
    List<Document> findByCategoryId(String categoryId);

    /**
     * 搜索文档
     */
    List<Document> searchDocuments(String keyword, String userId, Integer limit);

    /**
     * 查询热门文档
     */
    List<Document> findHotDocuments(Integer limit);

    /**
     * 查询最新文档
     */
    List<Document> findLatestDocuments(Integer limit);

    /**
     * 获取文档统计信息
     */
    DocumentStatisticsVO getDocumentStatistics(String documentId);

    /**
     * 获取用户存储统计
     */
    DocumentStatisticsVO getUserStorageStatistics(String userId);

    /**
     * 记录文档访问
     */
    Boolean recordAccess(String documentId, String userId, String accessType);

    /**
     * 更新文档统计
     */
    Boolean updateStatistics(String documentId, String statisticsType);

    /**
     * 查询相关文档
     */
    List<Document> findRelatedDocuments(String documentId, Integer limit);

    /**
     * 查询文档版本数量
     */
    Integer countVersions(String documentId);

    /**
     * 查询文档分享数量
     */
    Integer countShares(String documentId);
}
